import {isNull} from "@/utils/zzDouUtils/ObjUtil";

/**
 * 数组求和
 * @param array 数组
 * 在 JavaScript 中，数组求和的效率最高的方法是使用 reduce() 方法
 * 这个方法会对数组中的每个元素依次执行一个回调函数，最终返回一个累加器的值
 * 时间复杂度: O(n)
 */
export function arrSum(array){
  return array.reduce((acc, cur) => acc + cur, 0);
}

/**
 * 如果数组的元素是对象，可以通过指定 reduce()方法的第二个参数来对对象中的某一个属性进行求和。
 * @param array 数组
 * @param key 键
 */
export function arrSumByKey(array,key){
  return array.reduce((acc, cur) => acc + cur[key], 0);
}

/**
 * 为数组里的每一个对象填充一个对象
 * @param array 数组 array[i]={}
 * @param element 添加的对象 {}
 * 在不改变原始数组的情况下，为每个对象添加一个新属性，使用 Object.assign() 方法。
 * 这个方法将一个或多个源对象的属性复制到目标对象中，并返回目标对象。你可以使用它来为每个对象添加一个新属性
 */
export function fillObj(array,element){
  return array.map(obj=>{
    return Object.assign({},obj,element);
  })
}

/**
 * @param array 数组 array[i]={}
 * @param key 键
 * @param value 值
 */
export function fillNode(array,key,value){
  return array.map(obj=>{
    let obj1 = {};
    obj1[key] = value;
    return Object.assign({},obj,obj1);
  })
}

/**
 * 将JSON字符串转为数组
 * @param str json字符串
 * @returns {any} 数组
 */
export function parseArr(str){
  return JSON.parse(str);
}

/**
 * 将数组转为JSON字符串
 * @param array 数组
 * @returns {any} json字符串
 */
export function toJsonStr(array){
  return JSON.stringify(array);
}

/**
 * 判断数组是否为空
 * @param array 数组
 * Array.isArray()是一个用于判断一个值是否为数组的方法
 * 它的返回值是一个布尔值，如果传入的参数是数组，则返回true，否则返回false
 * true：[]  [1, 2, 3]  new Array()
 * false：{} null undefined  123  'abc'
 */
export function isEmptyArr(array){
  return isNull(array) || (isArray(array) && array.length === 0);
}

export function isArray(array){
  return Array.isArray(array);
}
/**
 * 拷贝一个新数组
 * @param array 数组
 */
export function copyArr(array){
  return [...array];
}

export function push(array,...elements){
  elements.forEach( element =>{
    array.push(element);
  })
}

export function pushAll(array,array2){
  array2.forEach( element =>{
    array.push(element);
  })
}

export function containAny(value,...targets){
  return targets.includes(value);
}

